package control;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import reports.GestionReporte;
import reports.ReportDTO;
import reports.ReportData;
import util.Actualizacion;
import util.Fecha;
import util.FuncionesUtiles;
import dao.BdDao;
import dominio.Articulo;
import dominio.Cotizacion;
import dominio.Marca;
import dominio.Objeto;
import dominio.ReporteCotizacion;
import dominio.ReporteManoDeObra;
import dominio.Vehiculo;

public class GestionListaDePrecios implements GestionInterface {
	
	private BdDao dataBase;
	private Actualizacion actualizacion;

	public GestionListaDePrecios() {
		dataBase = new BdDao();
		actualizacion = new Actualizacion(dataBase);
	}
	
	public void actualizarDatos() {
		actualizacion.actualizarBD();
	}
	
	public Vector<Marca> inicializarMarcas() {
		Vector<Marca> marcas = new Vector<Marca>();
		marcas = dataBase.listarMarcas();
		
		 for(int i=1; i<marcas.size();i++) {
		    for(int j=0 ; j<marcas.size()-1; j++) {
		         if(marcas.elementAt(j).getNombre().compareTo(marcas.elementAt(j+1).getNombre())>0) {
		             Marca temp = marcas.elementAt(j);
		             marcas.set(j, marcas.elementAt(j+1));
		             marcas.set(j+1, temp);
		         }
		    }
		}	
		return marcas;
	}
	
	public Vector<Vehiculo> inicializarVehiculos(Marca marca) {
		Vector<Vehiculo> vehiculos = new Vector<Vehiculo>();
		vehiculos = dataBase.listarVehiculos(marca.getId_marca());
		
		for(int i=1; i<vehiculos.size();i++) {
		    for(int j=0 ; j<vehiculos.size()-1; j++) {
		    	if(!tieneMedida(vehiculos.elementAt(j).getNombre())) {
			             Vehiculo temp = vehiculos.elementAt(j);
			             vehiculos.set(j, vehiculos.elementAt(j+1));
			             vehiculos.set(j+1, temp);
		    	} else if(compararVehiculos(vehiculos.elementAt(j).getNombre(), 
		        		                    vehiculos.elementAt(j+1).getNombre())) {
		             Vehiculo temp = vehiculos.elementAt(j);
		             vehiculos.set(j, vehiculos.elementAt(j+1));
		             vehiculos.set(j+1, temp);
		        }
		     }
		}			
		return vehiculos;
	}
	
	private boolean tieneMedida(String vehiculo) {
		String[] aux = vehiculo.split("mm");
		if(FuncionesUtiles.StringIsDouble(aux[0]))
			return true;
		return false;			
	}
	
	private boolean compararVehiculos(String a, String b) {
		String[] a1 = a.split("mm");
		String[] b1 = b.split("mm");
		if(FuncionesUtiles.StringIsDouble(a1[0]) && FuncionesUtiles.StringIsDouble(b1[0])) {
			Double a2 = Double.parseDouble(a1[0]);
			Double b2 = Double.parseDouble(b1[0]);
			if(a2 > b2)
				return true;
			else 
				return false;
		}
		return false;
	}
	
	public Vector<Articulo> inicializarTabla(Vehiculo vehiculo) {
		Vector<Articulo> articulos = new Vector<Articulo>();
		articulos = dataBase.listarArticulos(vehiculo.getId_vehiculo());
		
		for(int i=1; i<articulos.size();i++) {
		    for (int j=0 ; j<articulos.size()-1; j++) {
				 if(articulos.elementAt(j).getRubro_marca().compareTo(articulos.elementAt(j+1).getRubro_marca())>0) {
				     Articulo temp = articulos.elementAt(j);
				     articulos.set(j, articulos.elementAt(j+1));
				     articulos.set(j+1, temp);
				 }
		    }
		}					
		return articulos;
	}
	
	public String ultimaActualizacion() {
		Calendar fecha = Fecha.obtenerFecha(dataBase.ultimaVersion());
		return Fecha.getFechaYHoraEnNumeros(fecha);      
	}
	
    public void generarReporteRepuestos(ReporteCotizacion reporte) {
		try {
			Map<String, Object> parameters = new HashMap<String, Object>();
			List<ReportDTO> list = new ArrayList<ReportDTO>();
			
			int indice = 1;
			for (Cotizacion i : reporte.getCotizaciones()) {
				
				ReportDTO ri = new ReportDTO();
				ri.setIndice(new Integer(indice).toString());
				indice++;
				ri.setCodigo(i.getCodigo());
				ri.setRubro_marca(i.getRubro_marca());
				ri.setDetalle(i.getDetalle());
				ri.setMedidas(i.getMedidas());
				ri.setBocas(i.getBocas());
				ri.setPrecio(i.getPrecio_listaFormateado());
				ri.setCantidad(i.getCantidad().toString());
				ri.setSubtotal(i.getSubtotalFormateado());
				list.add(ri);
			}
			
			Calendar fecha = Fecha.fechaActual();
			String fechaReporte = Fecha.getFechaEnLetras(fecha);			
			parameters.put("fechaReporte", fechaReporte);
			
			//parameters.put("logo", reporte.getLogo());
			parameters.put("marca", reporte.getMarca());
			parameters.put("vehiculo", reporte.getVehiculo());
			parameters.put("cliente", reporte.getCliente());
			parameters.put("importeTotal", reporte.getImporteTotalFormateado());
			
			ReportData reportData = new ReportData();
			reportData.setReportName("reporteCotizacion");
			reportData.setParameters(parameters);	
			reportData.setDataSource(new JRBeanCollectionDataSource(list));

			GestionReporte.generarReporte(reportData);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
	public Vector<Objeto> inicializarTapaCilindro() {
		return dataBase.listarTapaCilindro();
	}
	
	public Vector<Objeto> inicializarBlockMotor() {
		return dataBase.listarBlockMotor();
	}
    
    public void generarReporteCilindro(ReporteManoDeObra reporteCilindro) {
    	dataBase.actualizarPreciosTapaCilindro(reporteCilindro.getFilas());
		try {
			Map<String, Object> parameters = new HashMap<String, Object>();
			List<ReportDTO> list = new ArrayList<ReportDTO>();
			
			int indice = 1;
			for (Objeto i : reporteCilindro.getFilasConValor()) {
				
				ReportDTO ri = new ReportDTO();
				ri.setIndice(new Integer(indice).toString());
				indice++;
				ri.setCodigo(i.getCodigo());
				ri.setDetalle(i.getDetalle());
				ri.setPrecio(i.getPrecioFormateado());
				list.add(ri);
			}
			
			Calendar fecha = Fecha.fechaActual();
			String fechaReporte = Fecha.getFechaEnLetras(fecha);			
			parameters.put("fechaReporte", fechaReporte);
			
			//parameters.put("logo", reporte.getLogo());
			parameters.put("marca", reporteCilindro.getMarca());
			parameters.put("vehiculo", reporteCilindro.getVehiculo());
			parameters.put("cliente", reporteCilindro.getCliente());
			parameters.put("importeTotal", reporteCilindro.getImporteTotalFormateado());
			
			ReportData reportData = new ReportData();
			reportData.setReportName("reporteCilindro");
			reportData.setParameters(parameters);	
			reportData.setDataSource(new JRBeanCollectionDataSource(list));

			GestionReporte.generarReporte(reportData);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
    public void generarReporteBlock(ReporteManoDeObra reporteBlock) {
    	dataBase.actualizarPreciosBlockMotor(reporteBlock.getFilas());
		try {
			Map<String, Object> parameters = new HashMap<String, Object>();
			List<ReportDTO> list = new ArrayList<ReportDTO>();
			
			int indice = 1;
			for (Objeto i : reporteBlock.getFilasConValor()) {
				
				ReportDTO ri = new ReportDTO();
				ri.setIndice(new Integer(indice).toString());
				indice++;
				ri.setCodigo(i.getCodigo());
				ri.setDetalle(i.getDetalle());
				ri.setPrecio(i.getPrecioFormateado());
				list.add(ri);
			}
			
			Calendar fecha = Fecha.fechaActual();
			String fechaReporte = Fecha.getFechaEnLetras(fecha);			
			parameters.put("fechaReporte", fechaReporte);
			
			//parameters.put("logo", reporte.getLogo());
			parameters.put("marca", reporteBlock.getMarca());
			parameters.put("vehiculo", reporteBlock.getVehiculo());
			parameters.put("cliente", reporteBlock.getCliente());
			parameters.put("importeTotal", reporteBlock.getImporteTotalFormateado());
			
			ReportData reportData = new ReportData();
			reportData.setReportName("reporteBlock");
			reportData.setParameters(parameters);	
			reportData.setDataSource(new JRBeanCollectionDataSource(list));

			GestionReporte.generarReporte(reportData);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}
